{"cells":[{"metadata":{},"cell_type":"markdown","source":"# DM 7 - Terminale NSI\n\nSujet du bac Spécialité NSI 2024 - Amérique du Nord"},{"metadata":{},"cell_type":"markdown","source":"## Introduction\nCet exercice porte sur la programmation Python, la programmation orientée objet, les structures de données (file), l’ordonnancement et l’interblocage."},{"metadata":{},"cell_type":"markdown","source":"### Question 1\n**Citer les trois états dans lesquels un processus peut se trouver.**"},{"metadata":{"trusted":false},"cell_type":"markdown","source":"Les trois états possibles pour un processus sont :\n1. Prêt\n2. En cours d'exécution\n3. Bloqué (ou en attente)"},{"metadata":{},"cell_type":"markdown","source":"### Question 2\n**Citer les deux seuls états possibles pour un processus dans ce contexte.**"},{"metadata":{"trusted":false},"cell_type":"markdown","source":"Dans ce contexte simplifié, les deux états possibles sont :\n1. En cours d'exécution\n2. En attente dans la file"},{"metadata":{},"cell_type":"markdown","source":"### Question 3\n**Rectifier la classe `File` pour que la méthode `defile` renvoie `None` lorsque la file est vide.**"},{"metadata":{"trusted":false},"cell_type":"code","source":"class File:\n def __init__(self):\n self.contenu = []\n\n def enfile(self, element):\n self.contenu.append(element)\n\n def defile(self):\n if self.est_vide():\n return None\n return self.contenu.pop(0)\n\n def est_vide(self):\n return len(self.contenu) == 0","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Question 4\n**Compléter le chronogramme pour les processus `p1`, `p2`, `p3`, et `p4`.**"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Code en entier pour comprendre, mais pas demandé !!!\n\n# Classe File modifiée pour pouvoir afficher son contenu\nclass File:\n def __init__(self):\n self.contenu = []\n\n def enfile(self, element):\n self.contenu.append(element)\n\n def defile(self):\n if self.est_vide():\n return None\n return self.contenu.pop(0)\n\n def est_vide(self):\n return len(self.contenu) == 0\n\n def __str__(self):\n # Représentation lisible de la file pour affichage (ordre inversé)\n return ' -> '.join(proc.nom for proc in reversed(self.contenu))\n\n# Classe Processus\nclass Processus:\n def __init__(self, nom, duree):\n self.nom = nom\n self.duree = duree\n\n def execute_un_cycle(self):\n if self.duree > 0:\n self.duree -= 1\n\n def est_fini(self):\n return self.duree == 0\n\n# Classe Ordonnanceur\nclass Ordonnanceur:\n def __init__(self):\n self.temps = 0\n self.file = File()\n\n def ajoute_nouveau_processus(self, proc):\n '''Ajoute un nouveau processus dans la file de l'ordonnanceur.'''\n self.file.enfile(proc)\n\n def tourniquet(self):\n '''Effectue une étape d'ordonnancement et renvoie le nom du processus élu.'''\n self.temps += 1\n if not self.file.est_vide():\n proc = self.file.defile()\n proc.execute_un_cycle()\n if not proc.est_fini():\n self.file.enfile(proc)\n return proc\n return None\n\n# Définition des processus avec leur nom et leur durée en cycles\nA = Processus(\"A\", 3)\nB = Processus(\"B\", 4)\nC = Processus(\"C\", 3)\nD = Processus(\"D\", 5)\n\n# Dictionnaire associant chaque cycle à un processus créé à ce moment\ndepart_proc = {\n 0: D,\n 1: B,\n 2: A,\n 4: C\n}\n\n# Création de l'ordonnanceur\nordonnanceur = Ordonnanceur()\n\n\n# Simulation\nwhile True:\n if ordonnanceur.temps in depart_proc:\n ordonnanceur.ajoute_nouveau_processus(depart_proc[ordonnanceur.temps])\n \n # Afficher l'état initial de la file avant le cycle\n print(f'File initial: {ordonnanceur.file}', end=\"\")\n \n process_elected = ordonnanceur.tourniquet()\n if process_elected is None:\n break\n # Afficher le processus élu et l'état final de la file\n print(f' Cycle {ordonnanceur.temps}: ({process_elected.nom},{process_elected.duree}) File final: {ordonnanceur.file}')\n \n","execution_count":23,"outputs":[{"output_type":"stream","text":"File initial: D Cycle 1: (D,4) File final: D\nFile initial: B -> D Cycle 2: (D,3) File final: D -> B\nFile initial: A -> D -> B Cycle 3: (B,3) File final: B -> A -> D\nFile initial: B -> A -> D Cycle 4: (D,2) File final: D -> B -> A\nFile initial: C -> D -> B -> A Cycle 5: (A,2) File final: A -> C -> D -> B\nFile initial: A -> C -> D -> B Cycle 6: (B,2) File final: B -> A -> C -> D\nFile initial: B -> A -> C -> D Cycle 7: (D,1) File final: D -> B -> A -> C\nFile initial: D -> B -> A -> C Cycle 8: (C,2) File final: C -> D -> B -> A\nFile initial: C -> D -> B -> A Cycle 9: (A,1) File final: A -> C -> D -> B\nFile initial: A -> C -> D -> B Cycle 10: (B,1) File final: B -> A -> C -> D\nFile initial: B -> A -> C -> D Cycle 11: (D,0) File final: B -> A -> C\nFile initial: B -> A -> C Cycle 12: (C,1) File final: C -> B -> A\nFile initial: C -> B -> A Cycle 13: (A,0) File final: C -> B\nFile initial: C -> B Cycle 14: (B,0) File final: C\nFile initial: C Cycle 15: (C,0) File final: \nFile initial: ","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"\"Texte\n\nLe chronogramme complété est :\n\n File initial: p1 Cycle 1: (p1,3) File final: p1\n File initial: p3 -> p1 Cycle 2: (p1,2) File final: p1 -> p3\n File initial: p2 -> p1 -> p3 Cycle 3: (p3,4) File final: p3 -> p2 -> p1\n File initial: p4 -> p3 -> p2 -> p1 Cycle 4: (p1,1) File final: p1 -> p4 -> p3 -> p2\n File initial: p1 -> p4 -> p3 -> p2 Cycle 5: (p2,2) File final: p2 -> p1 -> p4 -> p3\n File initial: p2 -> p1 -> p4 -> p3 Cycle 6: (p3,3) File final: p3 -> p2 -> p1 -> p4\n File initial: p3 -> p2 -> p1 -> p4 Cycle 7: (p4,2) File final: p4 -> p3 -> p2 -> p1\n File initial: p4 -> p3 -> p2 -> p1 Cycle 8: (p1,0) File final: p4 -> p3 -> p2\n File initial: p4 -> p3 -> p2 Cycle 9: (p2,1) File final: p2 -> p4 -> p3\n File initial: p2 -> p4 -> p3 Cycle 10: (p3,2) File final: p3 -> p2 -> p4\n File initial: p3 -> p2 -> p4 Cycle 11: (p4,1) File final: p4 -> p3 -> p2\n File initial: p4 -> p3 -> p2 Cycle 12: (p2,0) File final: p4 -> p3\n File initial: p4 -> p3 Cycle 13: (p3,1) File final: p3 -> p4\n File initial: p3 -> p4 Cycle 14: (p4,0) File final: p3\n File initial: p3 Cycle 15: (p3,0) File final: \n File initial: \n \n\"Texte"},{"metadata":{},"cell_type":"markdown","source":"### Question 5\n**Compléter le code de la classe `Ordonnanceur`.**"},{"metadata":{"trusted":true},"cell_type":"code","source":"class Ordonnanceur:\n \n def __init__(self):\n self.temps = 0\n self.file = File()\n\n def ajoute_nouveau_processus(self, proc):\n '''Ajoute un nouveau processus dans la file de\n l'ordonnanceur. ''' \n self.file.enfile(proc)\n\n def tourniquet(self):\n '''Effectue une étape d'ordonnancement et renvoie le nom \n du processus élu.'''\n self.temps += 1\n if not self.file.est_vide():\n proc = self.file.defile()\n proc.execute_un_cycle()\n if not proc.est_fini():\n self.file.enfile(proc)\n return proc.nom\n return None","execution_count":25,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Question 6\n**Écrire un programme utilisant les processus `p1`, `p2`, `p3`, `p4` et `depart_proc`.**"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Définir les processus et leur moment de création\np1 = Processus('p1', 4)\np2 = Processus('p2', 3)\np3 = Processus('p3', 5)\np4 = Processus('p4', 3)\ndepart_proc = {0: p1, 1: p3, 2: p2, 3: p4}\n\n# Création de l'ordonnanceur\nordonnanceur = Ordonnanceur()\n\n# Simulation\nwhile True:\n if ordonnanceur.temps in depart_proc:\n ordonnanceur.ajoute_nouveau_processus(depart_proc[ordonnanceur.temps])\n \n process_elected = ordonnanceur.tourniquet()\n if process_elected is None:\n break\n # Afficher le processus élu et l'état final de la file\n print(f' Cycle {ordonnanceur.temps}: {process_elected}')","execution_count":27,"outputs":[{"output_type":"stream","text":" Cycle 1: p1\n Cycle 2: p1\n Cycle 3: p3\n Cycle 4: p1\n Cycle 5: p2\n Cycle 6: p3\n Cycle 7: p4\n Cycle 8: p1\n Cycle 9: p2\n Cycle 10: p3\n Cycle 11: p4\n Cycle 12: p2\n Cycle 13: p3\n Cycle 14: p4\n Cycle 15: p3\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"### Question 7\n**Montrer que l’ordre d’exécution donné en exemple aboutit à une situation d’interblocage.**"},{"metadata":{"trusted":false},"cell_type":"markdown","source":"\"Texte"},{"metadata":{},"cell_type":"markdown","source":" Dans l’exécution :\n Cycle 1 : D acquiert le fichier,\n Cycle 2 : D fais des Calculs,\n Cycle 3 : B acquiert le clavier, \n Cycle 4 : D acquérir le clavier,\n Cycle 5 : A acquiert le GPU,\n Cycle 6 : B veut acquiert le fichier, mais il est pris par D. On a donc une situation d’interblocage."}],"metadata":{},"nbformat":4,"nbformat_minor":2}